Fix up _gdk_windowing_window_at_pointer coordinate reporting
authorAlexander Larsson <alexl@redhat.com>
Mon, 5 Oct 2009 09:39:29 +0000 (11:39 +0200)
committerAlexander Larsson <alexl@redhat.com>
Mon, 5 Oct 2009 09:41:50 +0000 (11:41 +0200)
We need to do a final XQueryWindow to get the coordinates inside the
windows rather than in the parent window.

This fixes bug #597386, "Cannot click buttons more than once...", which
failed due to the grab tracking stuff getting the wrong coordinates as
per the above.

gdk/x11/gdkwindow-x11.c

index c65a0d4f26c28f641e80051e5770d2a2db6de709..a8dd83b6bc60ad8cbf219cd239c4fb7d28638f70 100644 (file)
@@ -3252,12 +3252,15 @@ _gdk_windowing_window_at_pointer (GdkDisplay *display,
       while (xwindow)
        {
          xwindow_last = xwindow;
-         if (get_toplevel &&
-             (window = gdk_window_lookup_for_display (display, xwindow)) != NULL &&
-             GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
-           break;
          XQueryPointer (xdisplay, xwindow,
                         &root, &xwindow, &rootx, &rooty, &winx, &winy, &xmask);
+         if (get_toplevel &&
+             (window = gdk_window_lookup_for_display (display, xwindow_last)) != NULL &&
+             GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
+           {
+             xwindow = xwindow_last;
+             break;
+           }
        }
     } 
   else 
@@ -3315,16 +3318,16 @@ _gdk_windowing_window_at_pointer (GdkDisplay *display,
       while (xwindow)
        {
          xwindow_last = xwindow;
-         if (get_toplevel &&
-             (window = gdk_window_lookup_for_display (display, xwindow)) != NULL &&
-             GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
-           break;
          gdk_error_trap_push ();
          XQueryPointer (xdisplay, xwindow,
                         &root, &xwindow, &rootx, &rooty, &winx, &winy, &xmask);
          gdk_flush ();
          if (gdk_error_trap_pop ())
            break;
+         if (get_toplevel &&
+             (window = gdk_window_lookup_for_display (display, xwindow_last)) != NULL &&
+             GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
+           break;
        }
     }